package common

import (
	"fmt"
	"unsafe"
)

type T struct {
	t1 int8
	t2 byte
	t3 int64
	t4 string
	t5 int8
}

func unsafeTest3() {
	t := &T{1, 2, 3, "", 2}

	fmt.Println("对齐值 ： ", unsafe.Alignof(*t))

	fmt.Println("对象长度  ： ", unsafe.Sizeof(*t))
	fmt.Println("----------")

	fmt.Println("对齐值 ： ", unsafe.Alignof(t.t1))
	fmt.Println(unsafe.Sizeof(t.t1))
	fmt.Println("对齐值 ： ", unsafe.Alignof(t.t2))
	fmt.Println(unsafe.Sizeof(t.t2))
	fmt.Println("对齐值 ： ", unsafe.Alignof(t.t3))
	fmt.Println(unsafe.Sizeof(t.t3))
	fmt.Println("对齐值 ： ", unsafe.Alignof(t.t4))
	fmt.Println(unsafe.Sizeof(t.t4))
	fmt.Println("对齐值 ： ", unsafe.Alignof(t.t5))
	fmt.Println(unsafe.Sizeof(t.t5))
}

func UnsafeTest2() {
	s := struct {
		a byte
		b int
		c int
	}{0, 2, 3}
	// 将结构体指针转换为通用指针
	p := unsafe.Pointer(&s)
	// 保存结构体的地址备用（偏移量为 0）
	up0 := uintptr(p)
	// 将通用指针转换为 byte 型指针
	pb := (*byte)(p)
	// 给转换后的指针赋值
	*pb = 10
	// 结构体内容跟着改变
	fmt.Println(s)

	// 偏移到第 2 个字段
	up := up0 + unsafe.Offsetof(s.b)
	// 将偏移后的地址转换为通用指针
	p = unsafe.Pointer(up)
	// 将通用指针转换为 byte 型指针
	pb = (*byte)(p)
	// 给转换后的指针赋值
	*pb = 20
	// 结构体内容跟着改变
	fmt.Println(s)

}
